Re: Composite types for composite primary/foreign keys?

Поиск
Список
Период
Сортировка
От Wolfgang Keller
Тема Re: Composite types for composite primary/foreign keys?
Дата
Msg-id C1CF0C2B64D6335AE95A1E78@[192.168.1.25]
обсуждение исходный текст
Список pgsql-general
Hello,

and thanks again for your reply.

And excuse me for taking so long to reply.

> I wanted to simplify the schema and make it more "readable" for
>> clueless morons like me. >;->
>
> Simplifying the schema is fine (and good!) as long as it exhibits the
> same behavior as the more complex one:

Well, that (same behaviour) is probably not the case in my case (see
below).

> often in the course of
> simplifying you find a solution yourself. However, we cannot help you
> if you don't provide adequate information.

I'm not sure whether I am violating some copyright, so I didn't want to
post the SQL script here. But the script is publicly downloadable at
www.mimosa.org, and I only need a part of it to explain the basic
concept. So this is the "complex" schema.

CREATE TABLE enterprise_type(
    ent_db_site         cris_string16_type      NOT NULL,
    ent_db_id           cris_uint_type          NOT NULL,
    ent_type_code       cris_uint_type          NOT NULL,
    name                cris_string254_type     NOT NULL,
    user_tag_ident      cris_string254_type,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code     cris_ushort_type,
    PRIMARY KEY (ent_db_site, ent_db_id, ent_type_code)
)
;

CREATE TABLE enterprise(
    enterprise_id       cris_uint_type              NOT NULL,
    ent_db_site         cris_string16_type          NOT NULL,
    ent_db_id           cris_uint_type              NOT NULL,
    ent_type_code       cris_uint_type              NOT NULL,
    user_tag_ident      cris_string254_type,
    name                cris_string254_type         NOT NULL,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code     cris_ushort_type,
    PRIMARY KEY (enterprise_id)
)
;

CREATE TABLE site_type(
    st_db_site          cris_string16_type      NOT NULL,
    st_db_id            cris_uint_type          NOT NULL,
    st_type_code        cris_uint_type          NOT NULL,
    name                cris_string254_type     NOT NULL,
    user_tag_ident      cris_string254_type,
    mobile_yn           cris_no_or_yes_type,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code     cris_ushort_type,
    PRIMARY KEY (st_db_site, st_db_id, st_type_code)
)
;

CREATE TABLE site_type_child(
    st_db_site            cris_string16_type    NOT NULL,
    st_db_id              cris_uint_type        NOT NULL,
    st_type_code          cris_uint_type        NOT NULL,
    child_st_db_site      cris_string16_type    NOT NULL,
    child_st_db_id        cris_uint_type        NOT NULL,
    child_st_type_code    cris_uint_type        NOT NULL,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code       cris_ushort_type,
    PRIMARY KEY (st_db_site, st_db_id, st_type_code, child_st_db_site,
child_st_db_id, child_st_type_code)
)
;

CREATE TABLE site(
    site_code           cris_string16_type      NOT NULL,
    enterprise_id       cris_uint_type          NOT NULL,
    site_id             cris_uint_type          NOT NULL,
    st_db_site          cris_string16_type      NOT NULL,
    st_db_id            cris_uint_type          NOT NULL,
    st_type_code        cris_uint_type          NOT NULL,
    user_tag_ident      cris_string254_type,
    name                cris_string254_type,
    duns_number         cris_uint_type,
    template_yn         cris_no_or_yes_type,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code     cris_ushort_type,
    PRIMARY KEY (site_code)
)
;

CREATE TABLE manufacturer(
    mf_db_site            cris_string16_type    NOT NULL,
    mf_db_id              cris_uint_type        NOT NULL,
    manuf_code            cris_uint_type        NOT NULL,
    manuf_trade_name      cris_string254_type   NOT NULL,
    company_name          cris_string254_type   NOT NULL,
    phys_addr             cris_string254_type,
    phys_city_name        cris_string254_type,
    phys_state_abbr       cris_string254_type,
    phys_postal_code      cris_string254_type,
    phys_country_abbr     cris_string254_type,
    mail_addr             cris_string254_type,
    mail_city_name        cris_string254_type,
    mail_state_abbr       cris_string254_type,
    mail_postal_code      cris_string254_type,
    mail_country_abbr     cris_string254_type,
    us_ph_number          cris_string254_type,
    int_ph_country_no     cris_string254_type,
    int_ph_city_no        cris_string254_type,
    int_ph_local_no       cris_string254_type,
    us_fax_number         cris_string254_type,
    int_fax_country_no    cris_string254_type,
    int_fax_city_no       cris_string254_type,
    int_fax_local_no      cris_string254_type,
    business_desc         cris_string254_type,
    primary_sic           cris_string254_type,
    user_tag_ident        cris_string254_type,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code       cris_ushort_type,
    lc_alt_sic1           cris_string254_type,
    lc_alt_sic2           cris_string254_type,
    PRIMARY KEY (mf_db_site, mf_db_id, manuf_code)
)
;

CREATE TABLE site_database(
    db_site             cris_string16_type      NOT NULL,
    db_id               cris_uint_type          NOT NULL,
    user_tag_ident      cris_string254_type,
    name                cris_string254_type,
    mf_db_site          cris_string16_type,
    mf_db_id            cris_uint_type,
    manuf_code          cris_uint_type,
    gmt_last_updated    cris_datetime_type,
    last_upd_db_site    cris_string16_type,
    last_upd_db_id      cris_uint_type,
    rstat_type_code     cris_ushort_type,
    PRIMARY KEY (db_site, db_id)
)
;

Now I wanted to make it more readable and separate the identification
schema from the actual data by defining composite *_key_type types for
each table like this:

CREATE TYPE enterprise_type_key_type AS (
    ent_db_key          site_database_key_type
    ent_type_code       cris_uint_type
)
;

CREATE TABLE enterprise_type(
    ent_type_key        enterprise_type_key_type    NOT NULL,
    name                cris_string254_type         NOT NULL,
    user_tag_ident      cris_string254_type,
    last_upd_data       cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (ent_type_key)
)
;

CREATE TYPE enterprise_key_type AS (
    enterprise_id       cris_uint_type
)
;

CREATE TABLE enterprise(
    enterprise_key      enterprise_key_type         NOT NULL,
    ent_type_key        enterprise_type_key_type    NOT NULL,
    name                cris_string254_type         NOT NULL,
    user_tag_ident      cris_string254_type,
    last_upd_data       cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (enterprise_key)
)
;

CREATE TYPE site_type_key_type AS (
    st_db_key           site_database_key_type,
    st_type_code        cris_uint_type
)
;

CREATE TABLE site_type(
    st_type_key         site_type_key_type      NOT NULL,
    name                cris_string254_type     NOT NULL,
    user_tag_ident      cris_string254_type,
    mobile_yn           cris_no_or_yes_type,
    last_upd_data       cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (st_type_key)
)
;

CREATE TYPE site_type_child_key_type AS (
    st_type_key          site_type_key_type,
    child_st_type_key    site_type_key_type
)
;

CREATE TABLE site_type_child(
    site_type_child_key   site_type_child_key_type
    last_upd_data         cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (site_type_child_key)
)
;

CREATE TYPE site_key_type AS (
    site_code           cris_string16_type,
)
;

CREATE TABLE site(
    site_key            site_key_type               NOT NULL,
    enterprise_key      enterprise_key_type         NOT NULL,
    site_id             cris_uint_type              NOT NULL,
    st_type_key         site_type_key_type          NOT NULL,
    user_tag_ident      cris_string254_type,
    name                cris_string254_type,
    duns_number         cris_uint_type,
    template_yn         cris_no_or_yes_type,
    last_upd_data       cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (site_key)
)
;

CREATE TYPE manufacturer_key_type AS (
    mf_db_key             site_database_key_type,
    manuf_code            cris_uint_type
)
;

CREATE TABLE manufacturer(
    manuf_key             manufacturer_key_type     NOT NULL,
    manuf_trade_name      cris_string254_type       NOT NULL,
    company_name          cris_string254_type       NOT NULL,
    phys_addr             cris_addr_data_type,
    mail_addr             cris_addr_data_type,
    ph_number             cris_telecom_data_type,
    fax_number            cris_telecom_data_type,
    business_desc         cris_string254_type,
    primary_sic           cris_string254_type,
    user_tag_ident        cris_string254_type,
    last_upd_data         cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    lc_alt_sic1           cris_string254_type,
    lc_alt_sic2           cris_string254_type,
    PRIMARY KEY (manuf_key)
)
;

CREATE TYPE site_database_key_type AS (
    db_site_key         site_key_type,
    db_id               cris_uint_type
)
;

CREATE TABLE site_database(
    db_key              site_database_key_type    NOT NULL,
    user_tag_ident      cris_string254_type,
    name                cris_string254_type,
    manuf_key           manufacturer_key_type,
    last_upd_data       cris_last_upd_data_type,
    rstat_type_key      row_status_type_key_type,
    PRIMARY KEY (db_key)
)
;

The objective was to make the table definitions more readable (less
fields) and to simplify the work in case the identification schema
changes.

Nonsense? Am I nuts? Is that in fact totally useless? Or is there a
better (simpler) way to achieve this?

TIA,

Sincerely,

Wolfgang Keller

В списке pgsql-general по дате отправления:

Предыдущее
От: Richard Huxton
Дата:
Сообщение: Re: foreign key constraint, planner ignore index.
Следующее
От: Howard Cole
Дата:
Сообщение: Quick Regex Question